package controller;

import java.util.HashMap;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.view.RedirectView;

@Controller
public class LoginController {
	@RequestMapping("/toLogin.do")
	public String toLogin() {
		System.out.println("前往登录页面......");
		return "login";
	}
	
//	获取浏览器的请求参数——方法1：利用request实现
	/*
	 * DispatcherServlet在调用处理器的方法之前会分析该方法的签名，
	 * 		如果发现该方法有一个request对象就会将该request对象作为参数传递进来
	 */
	@RequestMapping("/login.do")
	public String login(HttpServletRequest request) {
		System.out.println("前往主页面（利用request读取请求参数）......");
		String adminCode = request.getParameter("adminCode");
		String password = request.getParameter("password");
		System.out.println("adminCode -->> " + adminCode);
		System.out.println("password -->> " + password);
		return "index1";
	}
	
//	获取浏览器的请求参数——方法2：利用@RequestParam("参数名")实现
	/*
	 * @RequestParam("password") > password是请求参数名
	 * 		> 行参名 和 请求参数名 不一致时必须使用@RequestParam("请求参数名")
	 * 		> 形参名 和 请求参数名一直时可以不用@RequestParam("请求参数名")
	 */
	@RequestMapping("/login2.do")
	public String login2(String adminCode, @RequestParam("password") String pwd) {
		System.out.println("前往主页面（利用@RequestParam实现读取请求参数）......");
		System.out.println("adminCode -->> " + adminCode);
		System.out.println("password -->> " + pwd);
		return "index1";
	}
	
//	获取浏览器的请求参数——方法3：利用Javabean实现
	@RequestMapping("/login3.do")
	public String login3(LoginBean lb) {
		System.out.println("前往主页面（利用javabean实现读取请求参数）......");
		System.out.println("adminCode -->> " + lb.getAdminCode());
		System.out.println("password -->> " + lb.getPassword());
		return "index1";
	}
	
//	向页面相应数据——方法1：利用request实现
	@RequestMapping("/login4.do")
	public String login4(HttpServletRequest request, LoginBean lb) {
		System.out.println("利用request向页面响应数据（原理：转发时servlet和jsp使用同一个request）");
//		绑定数据到request上
//		request.setAttribute("username", lb.getAdminCode());
		request.setAttribute("user", lb);
//		或自动进行转发操作
		return "index1";
	}
	
//	向页面相应数据——方法2：利用ModelAndView对象实现
	@RequestMapping("/login5.do")
	public ModelAndView login5(LoginBean lb) {
		System.out.println("利用ModelAndView对象向页面响应数据");
		Map<String, Object> data = new HashMap<String, Object>();
		data.put("username", lb.getAdminCode());
		data.put("pwd", lb.getPassword());
		return new ModelAndView("index1", data);
	}
	
//	向页面相应数据——方法3：利用ModelMap对象实现
	@RequestMapping("/login6.do")
	public String login6(LoginBean lb, ModelMap mm) {
		System.out.println("利用ModelMap对象向页面响应数据");
//		将数据添加到 ModelMap 里面
//		相当于执行了： request.setAttribute("user", lb);
//			故：在jsp页面中读取信息时和使用request时的读取方法一样
		mm.addAttribute("user", lb);
		return "index1";
	}
	
//	向页面相应数据——方法4：利用session实现（一般不用）
	@RequestMapping("/login7.do")
	public String login7(LoginBean lb, HttpSession session) {
		System.out.println("利用session向页面响应数据");
		session.setAttribute("user", lb);
		return "index1";
	}
	
//	转发1：方法的返回值是 String类型
	@RequestMapping("/login8.do")
	public String login8() {
		System.out.println("我要进行转发啦((方法返回值是String类型))......");
		return "redirect:toIndex.do";
	}
//	转发2：方法的方绘制是ModelAndView类型
	@RequestMapping("/login9.do")
	public ModelAndView login9() {
		System.out.println("我要进行转发啦(方法返回值是ModelAndView类型)......");
		RedirectView rv = new RedirectView("toIndex.do");
		return new ModelAndView(rv);
	}
	
	@RequestMapping("/toIndex.do")
	public String toIndex() {
		System.out.println("我在前往主页面......");
		return "index";
	}
	
}
